home *** CD-ROM | disk | FTP | other *** search
- package sun.font;
-
- import java.lang.ref.Reference;
- import java.lang.ref.ReferenceQueue;
- import java.lang.ref.SoftReference;
- import java.lang.ref.WeakReference;
- import java.security.AccessController;
- import sun.java2d.Disposer;
- import sun.misc.Unsafe;
-
- public final class StrikeCache {
- static final Unsafe unsafe = Unsafe.getUnsafe();
- static ReferenceQueue refQueue = Disposer.getQueue();
- static int MINSTRIKES = 8;
- static int recentStrikeIndex = 0;
- static FontStrike[] recentStrikes;
- static boolean cacheRefTypeWeak;
- static int nativeAddressSize;
- static int glyphInfoSize;
- static int xAdvanceOffset;
- static int yAdvanceOffset;
- static int boundsOffset;
- static int widthOffset;
- static int heightOffset;
- static int rowBytesOffset;
- static int topLeftXOffset;
- static int topLeftYOffset;
- static int pixelDataOffset;
- static long invisibleGlyphPtr;
-
- static native void getGlyphCacheDescription(long[] var0);
-
- static void refStrike(FontStrike var0) {
- int var1 = recentStrikeIndex;
- recentStrikes[var1] = var0;
- ++var1;
- if (var1 == MINSTRIKES) {
- var1 = 0;
- }
-
- recentStrikeIndex = var1;
- }
-
- static void disposeStrike(FontStrikeDisposer var0) {
- if (var0.intGlyphImages != null) {
- freeIntMemory(var0.intGlyphImages, var0.pScalerContext);
- } else if (var0.longGlyphImages != null) {
- freeLongMemory(var0.longGlyphImages, var0.pScalerContext);
- } else if (var0.segIntGlyphImages != null) {
- for(int var1 = 0; var1 < var0.segIntGlyphImages.length; ++var1) {
- if (var0.segIntGlyphImages[var1] != null) {
- freeIntMemory(var0.segIntGlyphImages[var1], var0.pScalerContext);
- var0.pScalerContext = 0L;
- var0.segIntGlyphImages[var1] = null;
- }
- }
-
- if (var0.pScalerContext != 0L) {
- freeIntMemory(new int[0], var0.pScalerContext);
- }
- } else if (var0.segLongGlyphImages != null) {
- for(int var2 = 0; var2 < var0.segLongGlyphImages.length; ++var2) {
- if (var0.segLongGlyphImages[var2] != null) {
- freeLongMemory(var0.segLongGlyphImages[var2], var0.pScalerContext);
- var0.pScalerContext = 0L;
- var0.segLongGlyphImages[var2] = null;
- }
- }
-
- if (var0.pScalerContext != 0L) {
- freeLongMemory(new long[0], var0.pScalerContext);
- }
- }
-
- }
-
- static native void freeIntPointer(int var0);
-
- static native void freeLongPointer(long var0);
-
- private static native void freeIntMemory(int[] var0, long var1);
-
- private static native void freeLongMemory(long[] var0, long var1);
-
- public static Reference getStrikeRef(FontStrike var0) {
- return getStrikeRef(var0, cacheRefTypeWeak);
- }
-
- public static Reference getStrikeRef(FontStrike var0, boolean var1) {
- if (var0.disposer == null) {
- return (Reference)(var1 ? new WeakReference(var0) : new SoftReference(var0));
- } else {
- return (Reference)(var1 ? new WeakDisposerRef(var0) : new SoftDisposerRef(var0));
- }
- }
-
- static {
- long[] var0 = new long[11];
- getGlyphCacheDescription(var0);
- nativeAddressSize = (int)var0[0];
- glyphInfoSize = (int)var0[1];
- xAdvanceOffset = (int)var0[2];
- yAdvanceOffset = (int)var0[3];
- widthOffset = (int)var0[4];
- heightOffset = (int)var0[5];
- rowBytesOffset = (int)var0[6];
- topLeftXOffset = (int)var0[7];
- topLeftYOffset = (int)var0[8];
- pixelDataOffset = (int)var0[9];
- invisibleGlyphPtr = var0[10];
- if (nativeAddressSize < 4) {
- throw new InternalError("Unexpected address size for font data: " + nativeAddressSize);
- } else {
- AccessController.doPrivileged(new 1());
- }
- }
- }
-